#include "main.h"
#include "MAX6675.h"
#include "tim.h"

/********************************************** 滤波参数配置 *******************************************/
// 每个传感器的滤波缓冲区结构体
typedef struct {
    float buffer[FILTER_WINDOW_SIZE];  // 历史数据缓冲区
    uint8_t index;                     // 当前数据索引
    uint8_t count;                     // 缓冲区中有效数据数量
} TempFilterStruct;

// 32路传感器的滤波缓冲区（与32路传感器一一对应）
static TempFilterStruct tempFilters[32] = {0};
/********************************************** 滤波参数配置 *******************************************/

// GPIO结构体
typedef struct
{
    GPIO_TypeDef* Prot;
    uint16_t Pin;
}GPIO_ProtPin;

GPIO_ProtPin gpio_pins[32] = {
    // ------------------- Level1 MOSI（引脚3~10） -------------------
    {GPIOH, GPIO_PIN_8},    // 引脚3: H8
    {GPIOC, GPIO_PIN_10},   // 引脚4: C10
    {GPIOB, GPIO_PIN_14},   // 引脚5: B14
    {GPIOB, GPIO_PIN_2},    // 引脚6: B2
    {GPIOD, GPIO_PIN_11},   // 引脚7: D11
    {GPIOD, GPIO_PIN_12},   // 引脚8: D12
    {GPIOI, GPIO_PIN_3},    // 引脚9: I3
    {GPIOA, GPIO_PIN_11},   // 引脚10: A11

    // ------------------- Level2 MOSI（引脚3~10） -------------------
    {GPIOC, GPIO_PIN_6},    // 引脚3: C6
    {GPIOB, GPIO_PIN_11},   // 引脚4: B11
    {GPIOD, GPIO_PIN_5},    // 引脚5: D5
    {GPIOD, GPIO_PIN_3},    // 引脚6: D3
    {GPIOG, GPIO_PIN_12},   // 引脚7: G12
    {GPIOG, GPIO_PIN_14},   // 引脚8: G14
    {GPIOB, GPIO_PIN_0},    // 引脚9: B0
    {GPIOG, GPIO_PIN_9},    // 引脚10: G9

    // ------------------- Level3 MOSI（引脚3~10） -------------------
    {GPIOG, GPIO_PIN_11},   // 引脚3: G11
    {GPIOC, GPIO_PIN_4},    // 引脚4: C4
    {GPIOB, GPIO_PIN_3},    // 引脚5: B3
    {GPIOB, GPIO_PIN_5},    // 引脚6: B5
    {GPIOB, GPIO_PIN_8},    // 引脚7: B8
    {GPIOA, GPIO_PIN_6},    // 引脚8: A6
    {GPIOA, GPIO_PIN_4},    // 引脚9: A4
    {GPIOF, GPIO_PIN_9},    // 引脚10: F9

    // ------------------- Level4 MOSI（引脚3~10） -------------------
    {GPIOE, GPIO_PIN_4},    // 引脚3: E4
    {GPIOE, GPIO_PIN_5},    // 引脚4: E5
    {GPIOE, GPIO_PIN_3},    // 引脚5: E3
    {GPIOA, GPIO_PIN_1},    // 引脚6: A1
    {GPIOC, GPIO_PIN_0},    // 引脚7: C0
    {GPIOC, GPIO_PIN_2},    // 引脚8: C2
    {GPIOA, GPIO_PIN_2},    // 引脚9: A2
    {GPIOH, GPIO_PIN_7}     // 引脚10: H7
};

//
// @ MySPI 软件初始化函数
//

void SPI_WCS(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
    HAL_GPIO_WritePin(GPIOx,GPIO_Pin,PinState);
}

void SPI_WSCK1(GPIO_PinState PinState)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,PinState);
}

int SPI_R1_MISO(void)
{
    return HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12);
}

//
// @ MySPI 初始化函数
//

void SPI_Init(void)
{
    // 1. 使能所有涉及的GPIO时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    __HAL_RCC_GPIOI_CLK_ENABLE();
    
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 2. 配置 SCK（所有Level共享，PC8）
    GPIO_InitStruct.Pin       = GPIO_PIN_8;
    GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;   // 推挽输出
    GPIO_InitStruct.Pull      = GPIO_PULLUP;           // 上拉
    GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);  // 初始低电平

    // 3. 配置 MISO（SO，所有Level共享，PC12）
    GPIO_InitStruct.Pin       = GPIO_PIN_12;
    GPIO_InitStruct.Mode      = GPIO_MODE_INPUT;       // 输入模式
    GPIO_InitStruct.Pull      = GPIO_NOPULL;           // 无上下拉
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin       = GPIO_PIN_3;
    GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;       // 输入模式
    GPIO_InitStruct.Pull      = GPIO_NOPULL;           // 无上下拉
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    // 简化的引脚配置（原代码重复部分优化）
    for (int level = 0; level < 4; level++) {
        for (int pin = 0; pin < 8; pin++) {
            int index = level * 8 + pin;
            GPIO_InitStruct.Pin = gpio_pins[index].Pin;
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
            HAL_GPIO_Init(gpio_pins[index].Prot, &GPIO_InitStruct);
        }
    }
    
    SPI_WSCK1(0);
}

// 初始化MAX6675（已包含SPI初始化和滤波缓冲区初始化）
void MAX6675_Init(void)
{
    SPI_Init();
    
    // 初始化滤波缓冲区
    for (uint8_t i = 0; i < 32; i++) {
        for (uint8_t j = 0; j < FILTER_WINDOW_SIZE; j++) {
            tempFilters[i].buffer[j] = 0.0f;
        }
        tempFilters[i].index = 0;
        tempFilters[i].count = 0;
    }
}

// 带滤波功能的MAX6675温度读取函数
float MAX6675_READDATA(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    // 1. 读取原始温度数据
    uint16_t Original_Data = 0;
    
    SPI_WCS(GPIOx, GPIO_Pin, 1);  
    HAL_Delay_us(2);  

    SPI_WCS(GPIOx, GPIO_Pin, 0);
    
    SPI_WSCK1(0); 
    HAL_Delay_us(2);    
    for(int i = 0; i < 15; i++)
    {
        SPI_WSCK1(1); 
        HAL_Delay_us(1);   
        
        if(SPI_R1_MISO()==1)
        {
            Original_Data|=0x0001;
        }
        
        Original_Data<<=1;
        SPI_WSCK1(0);
        HAL_Delay_us(1);
    }
    SPI_WCS(GPIOx, GPIO_Pin, 1);  
        
    HAL_Delay_us(2);
    
    // 2. 原始数据处理（与原代码一致）
    float rawTemp;
    if (Original_Data&0X04)
    {
        rawTemp = ERROR_VALUE;  // 热电偶开路错误
    }
    else
    {
        rawTemp = (Original_Data>>3) * (1023.75/4095);  // 转换为温度值
    }

    HAL_Delay(1);
    
    // 3. 滑动平均滤波处理
    uint8_t sensorIndex = 0;
    // 查找对应的传感器索引（根据GPIO和Pin匹配）
    for (uint8_t i = 0; i < 32; i++) {
        if (gpio_pins[i].Prot == GPIOx && gpio_pins[i].Pin == GPIO_Pin) {
            sensorIndex = i;
            break;
        }
    }
    
    TempFilterStruct *filter = &tempFilters[sensorIndex];
    float sum = 0.0f;
    uint8_t validCount = 0;
    
    // 更新缓冲区
    filter->buffer[filter->index] = rawTemp;
    filter->index = (filter->index + 1) % FILTER_WINDOW_SIZE;
    if (filter->count < FILTER_WINDOW_SIZE) {
        filter->count++;
    }
    
    // 计算有效数据的平均值
    for (uint8_t i = 0; i < filter->count; i++) {
        if (filter->buffer[i] != ERROR_VALUE) {
            sum += filter->buffer[i];
            validCount++;
        }
    }
    
    // 返回滤波结果
    if (validCount == 0) {
        return ERROR_VALUE;
    } else {
        return sum / validCount;
    }
}

// MAX6675任务函数（直接获取滤波后的温度值）
float MAX6675_REAL_Temperture[32];  // 存储滤波后的温度值

void MAX6675_Task(void)
{
    for(int i = 0; i < 32 ;i++ )
    {
        // 直接获取滤波后的温度值（已在READDATA函数中处理）
        MAX6675_REAL_Temperture[i] = MAX6675_READDATA(gpio_pins[i].Prot , gpio_pins[i].Pin);
    }
    HAL_Delay(500);
}
